package process

import (
	"encoding/json"
	"fmt"
	"go_example/src/chatroom/client/utils"
	"go_example/src/chatroom/common/message"
	"net"
	"os"
)

func ShowMenu(userId int)  {
	fmt.Printf(" --------------恭喜用户ID：%v 登陆成功--------------\n", userId)
	fmt.Println("|\t\t\t\t 1. 在线用户列表 \t\t\t\t\t |")
	fmt.Println("|\t\t\t\t 2. 发送消息 \t\t\t\t\t |")
	fmt.Println("|\t\t\t\t 3. 信息列表 \t\t\t\t\t |")
	fmt.Println("|\t\t\t\t 4. 退出登录 \t\t\t\t\t |")
	fmt.Println("|\t\t\t\t 请选择（1-4） \t\t\t\t\t |")
	fmt.Println(" ------------------------------------------------")

	var key int
	var content string
	var contextId int
	//因为总会使用到SmsProcess实例，因此我们将其定义在switch外部
	smsProcess := &SmsProcess{}
	fmt.Scanf("%d\n", &key)
	switch key {
		case 1:
			OutputOnlineUser()
		case 2:
			fmt.Println("\t\t\t 1. 群发消息")
			fmt.Println("\t\t\t 2. 私聊消息")
			fmt.Println("\t\t\t 3. 返回上一级菜单")
			fmt.Println("\t\t\t 请选择（1-3）")
			var keySms int
			fmt.Scanf("%d\n", &keySms)
			switch keySms {
				case 1:
					fmt.Println("请输入需要发送的消息：")
					fmt.Scanf("%s\n", &content)
					smsProcess.SendGroupMes(content)
				case 2:
					fmt.Println("请填写接收消息的用户ID：")
					fmt.Scanf("%d\n", &contextId)
					fmt.Printf("对方的用户ID：【%d】\n",contextId)
					fmt.Println("--------------------------------------------")
					fmt.Println("请输入文字：")
					fmt.Println("--------------------------------------------")
					fmt.Scanf("%s\n", &content)
					smsProcess.SendUserIdMes(content, contextId)
				case 3:
					ShowMenu(userId)
			default:
				fmt.Println("您输入的不正确...")
			}

		case 3:
		case 4:
			smsProcess.SendExitMes(userId)
			os.Exit(0)
			//从这里入手，如果有退出登录的话，将退出的信息发送到服务端
		default:
			fmt.Println("您输入的不正确...")
	}
}

func ServerProcessMes(Conn net.Conn)  {
	//创建一个transfer的实例，不断读取服务器发送的消息
	tf := &utils.Transfer{
		Conn: Conn,
	}
	for true {
		fmt.Printf("提示：客户端正在等待读取服务器返回的消息...\n")
		mes, err := tf.ReadPkg()
		if err != nil {
			fmt.Println("ServerProcessMes() tf.ReadPkg err=", err)
			return
		}
		//处理服务端返回的消息
		//fmt.Println("mes=", mes)
		switch mes.Type {
			case message.NotifyUserStatusMesType: //有人上线了
			    //取出NotifyUserStatusMes，把用户的信息，状态保存在客户的map中
				var notifyUserStatusMes message.NotifyUserStatusMes
				json.Unmarshal([]byte(mes.Data), &notifyUserStatusMes)
				UpdateUserStatus(&notifyUserStatusMes)
			case message.SmsMesType: //处理返回群发的消息
				OutputGroupMes(&mes)
			case message.SmsUserIdMesType: //处理返回单发用户的消息
				OutputUserIdMes(&mes)
			case message.SmsExitMesType:
				OutputExitMes(&mes)
			default:
				fmt.Println("服务端返回了未知类型")
		}
	}
}

